#ifndef __ZDFMDCORE_H_
#define __ZDFMDCORE_H_


	#include <syscfg.h>

	#define ZD_CLRWDT  asm("clrwdt")
	#define ZD_NOP  __nop()
	#define ZD_SLEEP  asm("sleep")

	#define ZD_BANK0_3 MSCON1&=~0x02
	#define ZD_BANK4_7 MSCON1|=0x02


	#define ZD_GIE_ENABLE GIE=1
	#define ZD_GIE_DISABLE GIE=0
	//#define ZD_GIE(x) GIE=(x)


	#define ZD_T0IE_ENABLE T0IE=1
	#define ZD_T0IE_DISABLE T0IE=0
	
	
	//#define ZD_T0IE(x) T0IE=(x)

	#define ZD_T0IF_CLEAN T0IF=0
	#define ZD_T0IF_GRIGGER (T0IE && T0IF)

	#define ZD_T0_ENABLE T0ON=1;
	#define ZD_T0_DISABLE T0ON=0;



	//#ifdef P0
	#define ZD_PORTA PORTA
	#define ZD_PORT0 PORTA
	#define ZD_PORTA_DIR TRISA
	#define ZD_PORT0_DIR TRISA

	#define ZD_PORTA_PHRES WPUA
	#define ZD_PORT0_PHRES WPUA
	#define ZD_PORTA_PDRES WPDA
	#define ZD_PORT0_PDRES WPDA

	#define ZD_PORTA_0 PA0
	#define ZD_PORTA_1 PA1
	#define ZD_PORTA_2 PA2
	#define ZD_PORTA_3 PA3
	#define ZD_PORTA_4 PA4
	#define ZD_PORTA_5 PA5
	#define ZD_PORTA_6 PA6
	#define ZD_PORTA_7 PA7

	#define ZD_PORT0_0 PA0
	#define ZD_PORT0_1 PA1
	#define ZD_PORT0_2 PA2
	#define ZD_PORT0_3 PA3
	#define ZD_PORT0_4 PA4
	#define ZD_PORT0_5 PA5
	#define ZD_PORT0_6 PA6
	#define ZD_PORT0_7 PA7

	//#endif
	
	//#ifdef P1
	#define ZD_PORTB PORTB
	#define ZD_PORT1 PORTB	
	#define ZD_PORTB_DIR TRISB
	#define ZD_PORT1_DIR TRISB

	#define ZD_PORTB_PHRES WPUB
	#define ZD_PORT1_PHRES WPUB
	#define ZD_PORTB_PDRES WPDB
	#define ZD_PORT1_PDRES WPDB



	#define ZD_PORT1_0 PB0
	#define ZD_PORT1_1 PB1
	#define ZD_PORT1_2 PB2
	#define ZD_PORT1_3 PB3
	#define ZD_PORT1_4 PB4
	#define ZD_PORT1_5 PB5
	#define ZD_PORT1_6 PB6
	#define ZD_PORT1_7 PB7

	#define ZD_PORTB_0 PB0
	#define ZD_PORTB_1 PB1
	#define ZD_PORTB_2 PB2
	#define ZD_PORTB_3 PB3
	#define ZD_PORTB_4 PB4
	#define ZD_PORTB_5 PB5
	#define ZD_PORTB_6 PB6
	#define ZD_PORTB_7 PB7

	//#endif
	
	//#ifdef P2
	#define ZD_PORTC PORTC
	#define ZD_PORT2 PORTC	
	#define ZD_PORTC_DIR TRISC
	#define ZD_PORT2_DIR TRISC

	#define ZD_PORTC_PHRES WPUC
	#define ZD_PORT2_PHRES WPUC
	#define ZD_PORTC_PDRES WPDC
	#define ZD_PORT2_PDRES WPDC


	#define ZD_PORTC_0 PC0
	#define ZD_PORTC_1 PC1
	#define ZD_PORTC_2 PC2
	#define ZD_PORTC_3 PC3
	#define ZD_PORTC_4 PC4
	#define ZD_PORTC_5 PC5
	#define ZD_PORTC_6 PC6
	#define ZD_PORTC_7 PC7


	//#endif

	#define ZD_PORTD PORTD
	#define ZD_PORTD_DIR TRISD

	#define ZD_PORTD_PHRES WPUD
	#define ZD_PORTD_PDRES WPDD

	#define ZD_PORTD_0 PD0
	#define ZD_PORTD_1 PD1
	#define ZD_PORTD_2 PD2
	#define ZD_PORTD_3 PD3
	#define ZD_PORTD_4 PD4
	#define ZD_PORTD_5 PD5
	#define ZD_PORTD_6 PD6
	#define ZD_PORTD_7 PD7




	#define ZD_PORT_OUTPUT_SET(gpdir,iobit) gpdir&=(~iobit)
	#define ZD_PORT_INPUT_SET(gpdir,iobit) gpdir|=(iobit)

	#define ZD_PORT_PHRES_SET(gpph,iobit) gpph|=(iobit)
	#define ZD_PORT_PDRES_SET(gppd,iobit) gppd|=(iobit)


/////////////////////////////////////////////////////////////////
	#define ZD_PORT_OUTPUT(port,bits) TRIS##port|=bits
	#define ZD_PORT_INPUT(port,bits) TRIS##port&=(~bits)
	#define ZD_PORT_PHRES(port,bits) WPU##port|=(bits)
	#define ZD_PORT_PDRES(port,bits) WPD##port|=(bits)
/////////////////////////////////////////////////////////////////

	#define ZD_FSYS_CLKSET_FOSC_DIV1    0x71//0B01110001
	#define ZD_FSYS_CLKSET_FOSC_DIV2    0x61//0B01100001
	#define ZD_FSYS_CLKSET_FOSC_DIV4    0x51//0B01010001
	#define ZD_FSYS_CLKSET_FOSC_DIV8    0x41//0B01000001
	#define ZD_FSYS_CLKSET_FOSC_DIV16   0x31//0B00110001
	#define ZD_FSYS_CLKSET_FOSC_DIV32   0x21//0B00100001
	#define ZD_FSYS_CLKSET_FOSC_DIV64   0x11//0B00010001
	
	#define ZD_FSYS_CLKSET_DEFAULT ZD_FSYS_CLKSET_FOSC_DIV1


	#define ZD_FSYS_CLKSET(clkset) OSCCON=clkset;
	
	//#define ZD_FSYS_CLKSET(clkset) ZD_NOP //该配置在烧录时用选项写入，用空指令代替

	#define ZD_TIMER0_LOAD_RELOAD TMR0
	#define ZD_TIMER0_LOAD TMR0
			

	#define ZD_TIMER0_CLKSET_FSYS 0x00
	#define ZD_TIMER0_CLKSET_T0CKI BIT5
	#define ZD_TIMER0_CLKSET_DEFAULT ZD_TIMER0_CLKSET_FSYS
	
	#define ZD_TIMER0_CLKSET(clkset) OPTION&=(~(BIT5)),OPTION|=(clkset)


	#define ZD_TIMER0_CLKPSASET_DIV1 BIT3
	#define ZD_TIMER0_CLKPSASET_DIV2 0x00
	#define ZD_TIMER0_CLKPSASET_DIV4 0x01
	#define ZD_TIMER0_CLKPSASET_DIV8 0x02
	#define ZD_TIMER0_CLKPSASET_DIV16 0x03
	#define ZD_TIMER0_CLKPSASET_DIV32 0x04
	#define ZD_TIMER0_CLKPSASET_DIV64 0x05
	#define ZD_TIMER0_CLKPSASET_DIV128 0x06
	#define ZD_TIMER0_CLKPSASET_DIV256 0x07

	
	#define ZD_TIMER0_CLKPSASET_DEFAULT ZD_TIMER0_CLKPSASET_DIV8
	
	#define ZD_TIMER0_CLKPSASET(clkset) OPTION&=(~(BIT0|BIT1|BIT2|BIT3)),OPTION|=(clkset)



	#define ZD_TIMER0_INIT ZD_TIMER0_CLKSET(ZD_TIMER0_CLKSET_DEFAULT),ZD_TIMER0_CLKPSASET(ZD_TIMER0_CLKPSASET_DEFAULT),ZD_T0_ENABLE





	//////////////////////////////////////////////////////
	#define ZD_ADC_CLKSET_FSYS_DIV1 0x30
	#define ZD_ADC_CLKSET_FSYS_DIV2 0x00
	#define ZD_ADC_CLKSET_FSYS_DIV4 0x40
	#define ZD_ADC_CLKSET_FSYS_DIV8 0x10
	#define ZD_ADC_CLKSET_FSYS_DIV16 0x50
	#define ZD_ADC_CLKSET_FSYS_DIV32 0x20
	#define ZD_ADC_CLKSET_FSYS_DIV64 0x60
	#define ZD_ADC_CLKSET_LIRC_DIV1 0x70


	
	#define ZD_ADC_CLKSET_DEFAULT ZD_ADC_CLKSET_FSYS_DIV16
	
	#define ZD_ADC_CLKSET(clkset) ADCON1&=(~(BIT4|BIT5|BIT6)),ADCON1|=((clkset))

	#define ZD_ADC_INIT ADCON1&=(~(BIT0|BIT1|BIT2|BIT3)),ADCON1|=(BIT0|BIT2),ADCON1|=(BIT7),ADCON0|=(BIT0)

	
	
	//
	#define ZD_ADC_CH0_ENABLE  	TRISB|=BIT2;ANSEL0|=BIT0
	#define ZD_ADC_CH1_ENABLE  	TRISB|=BIT3;ANSEL0|=BIT1
	#define ZD_ADC_CH2_ENABLE  	TRISD|=BIT4;ANSEL0|=BIT2
	#define ZD_ADC_CH3_ENABLE  	TRISB|=BIT4;ANSEL0|=BIT3
	#define ZD_ADC_CH4_ENABLE  	TRISB|=BIT5;ANSEL0|=BIT4
	#define ZD_ADC_CH5_ENABLE  	TRISB|=BIT6;ANSEL0|=BIT5
	#define ZD_ADC_CH6_ENABLE  	TRISB|=BIT7;ANSEL0|=BIT6
	#define ZD_ADC_CH7_ENABLE  	TRISC|=BIT0;ANSEL0|=BIT7
	#define ZD_ADC_CH8_ENABLE  	TRISC|=BIT1;ANSEL1|=BIT0
	#define ZD_ADC_CH9_ENABLE  	TRISC|=BIT2;ANSEL1|=BIT1
	#define ZD_ADC_CH10_ENABLE  TRISD|=BIT3;ANSEL1|=BIT2
	#define ZD_ADC_CH11_ENABLE  TRISC|=BIT3;ANSEL1|=BIT3
	#define ZD_ADC_CH12_ENABLE  TRISC|=BIT4;ANSEL1|=BIT4
	#define ZD_ADC_CH13_ENABLE  TRISC|=BIT5;ANSEL1|=BIT5
	#define ZD_ADC_CH14_ENABLE  TRISC|=BIT6;ANSEL1|=BIT6
	#define ZD_ADC_CH15_ENABLE  TRISD|=BIT5;ANSEL1|=BIT7
	#define ZD_ADC_CH16_ENABLE  TRISD|=BIT2;ZD_BANK4_7;ANSEL2|=BIT0;ZD_BANK0_3
	#define ZD_ADC_CH17_ENABLE  TRISC|=BIT7;ZD_BANK4_7;ANSEL2|=BIT1;ZD_BANK0_3
	#define ZD_ADC_CH18_ENABLE  TRISA|=BIT0;ZD_BANK4_7;ANSEL2|=BIT2;ZD_BANK0_3
	#define ZD_ADC_CH19_ENABLE  TRISA|=BIT1;ZD_BANK4_7;ANSEL2|=BIT3;ZD_BANK0_3
	#define ZD_ADC_CH20_ENABLE  TRISA|=BIT2;ZD_BANK4_7;ANSEL2|=BIT4;ZD_BANK0_3
	#define ZD_ADC_CH21_ENABLE  TRISA|=BIT3;ZD_BANK4_7;ANSEL2|=BIT5;ZD_BANK0_3
	#define ZD_ADC_CH22_ENABLE  TRISA|=BIT4;ZD_BANK4_7;ANSEL2|=BIT6;ZD_BANK0_3
	#define ZD_ADC_CH23_ENABLE  TRISA|=BIT5;ZD_BANK4_7;ANSEL2|=BIT7;ZD_BANK0_3
	#define ZD_ADC_CH24_ENABLE  TRISA|=BIT6;ZD_BANK4_7;ANSEL3|=BIT0;ZD_BANK0_3
	#define ZD_ADC_CH25_ENABLE  TRISA|=BIT7;ZD_BANK4_7;ANSEL3|=BIT1;ZD_BANK0_3
	#define ZD_ADC_CH26_ENABLE  TRISD|=BIT0;ZD_BANK4_7;ANSEL3|=BIT2;ZD_BANK0_3
	#define ZD_ADC_CH27_ENABLE  TRISD|=BIT1;ZD_BANK4_7;ANSEL3|=BIT3;ZD_BANK0_3
	#define ZD_ADC_CH28_ENABLE  TRISB|=BIT0;ZD_BANK4_7;ANSEL3|=BIT4;ZD_BANK0_3
	#define ZD_ADC_CH29_ENABLE  TRISB|=BIT1;ZD_BANK4_7;ANSEL3|=BIT5;ZD_BANK0_3

	 
	#define ZD_ADC_CH_SELECT(adch) ( ADCON0&=(~(BIT3|BIT4|BIT5|BIT6|BIT7)),ADCON0|=(((adch<<3))&(BIT3|BIT4|BIT5|BIT6|BIT7)) )

	#define ZD_ADC_GETVAL ((unsigned int)((ADRESH<<8)|(ADRESL)))
	
	#define ZD_ADC_START ADCON0|=(BIT1)    
	#define ZD_ADC_ISBUSY (ADCON0&BIT1)     
	#define ZD_ADC_ISNOTBUSY (0==(ADCON0&(BIT1)))	

	
	//#define ZD_UART1_TXBUF TXREG
	//#define ZD_UART1_RXBUF RCREG


	#define ZD_IAP_WRITEDATA_SET(x) 	IAPDAT = (x);
	#define ZD_IAP_WRITEADDR_SET(x) 	IAPADH = (((x)>>8)&0X7F),IAPADL = (x)
	#define ZD_IAP_DATAAREA_SET(x) 	IAPADE = (x)
	#define ZD_IAP_DATAAREA_EEPROM 	ZD_IAP_DATAAREA_SET(0x02)
	
	#define ZD_IAP_WRITE_START 		IAPKEY = 240,IAPCTL = 0x06
	
	#define ZD_IAP_DATAREAD(x) 		(*(0+x))
	
	#define ZD_IAP_END IAPADE = 0x00
	


	#define ZD_TOUCH_KEY_CH(x) BIT##x


	#define ZD_INTERRUPT_INIT INTCON=0

	#define ZD_PORT_INIT PORTA=0,PORTC=0,PORTB=0,TRISA=0,TRISB=0,TRISC=0,WPUA=0,WPUB=0,WPDA=0,WPDB=0,ANSEL0=0,OPTION&=~0x80 //使能PORTA端口上拉由WPUA控制
	

#endif